package com.qq.文件_io_字符.文件;


import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/*
    目标：学会创建File对象定位操作系统的文件（文件 文件夹）File类在java.io.File包下。
    1.File对象可以定位文件和文件夹，可以删除、获取文件信息等。但是不能读写文件内容。
	2.File封装的对象仅仅是一个路径名，这个路径可以是存在的，也可以是不存在的。

	构造方法：
	public File​(String pathname)				根据文件路径创建文件对象
	public File​(String parent, String child)	根据父路径名字符串和子路径名字符串创建文件对象
	public File​(File  parent, String child)		根据父路径对应文件对象和子路径名字符串创建文件对象


	问题：使用相对路径和绝对路径，一旦路径名改变就找不到了。
	答：使用动态获取文件路径。
	
	动态获取文件路径的方式：
	ClassLoader.getResource()：类加载器获取文件路径
	从类对象的根目录下获取该文件路径，使用类加载器，路径名不能以反斜杠/开头。
	Test1.class.getClassLoader().getResource("data.txt").getFile(); 
	Test1.class.getClassLoader().getResource("com/qq/XML/ttt.txt").getFile();
 	
	Class.getResource()：类对象获取文件路径
	加上  /  获取类所在根目录下该文件的路径
	Test1.class.getResource("/txt.txt").getFile(); 
	Test1.class.getResource("/com/qq/XML/ttt.txt").getFile(); 
	直接写文件名 ，获取类所在包下该文件的路径：
	Test1.class.getResource("txt.txt").getFile(); 
	
	动态获取输入流：
	直接写文件名 ，获取类所在包下该文件的输入流：
	Test1_new.class.getResourceAsStream("ps.txt");
 	加上  /  获取类所在根目录下该文件的输入流：
    Test1_new.class.getResourceAsStream("/ps.txt");
    
 	使用类加载器getClassLoader(),直接写文件名，获取类所在根目录下的输入流，不能/开头
    String file5 = Test1_new.class.getClassLoader().getResourceAsStream("ps.txt").toString();
    
    注：只要使用类加载器获取，开头就不能加/ ,且默认为到类所在根路径获取文件

 */
public class Test1_new {
    public static void main(String[] args) throws IOException {
        // 1、创建File对象（指定了文件的路径）
        // 路径写法： 1.D:\\resources\\xueshan.jpeg  要写两个斜杠，因为怕被认为是\t\n等转义字符
        //         2.D:/resources/xueshan.jpeg
        //         3.File.separator 当作斜杠使用，优点是兼容性好其他操作系统也能识别。
    	//混用不报错，但不建议混用D:\\JAVA学习\\乱七八糟/文件操作\\游戏
    	
//        File f = new File("D:\\resources\\xueshan.jpeg");
//        File f = new File("D:/resources/xueshan.jpeg");
        File f = new File("D:" + File.separator+"JAVA学习"
        					+ File.separator +"乱七八糟" 
        					+ File.separator +"文件操作"
        					+File.separator+"学习.txt");
        long size = f.length(); // 是文件的字节大小
        System.out.println(size);
        System.out.println(f);
        //直接打印封装的文件路径对象，将打印创建文件对象的时候用的路径
        //因为File对象toString重写为打印路径。

        // 2、File创建对象，
        // 绝对路径 ：从盘符开始
        File f1 = new File("D:\\JAVA学习\\文件操作\\学习.txt");
        System.out.println(f1.exists());
        System.out.println(f1.length());

        // 相对路径： 模块名+文件名，因为默认直接到当前工程下的目录寻找文件。
        //eclipse没有模块，工程下面直接就是src文件
        File f2 = new File("src/data.txt");//在面向对象1这个工程里寻找该文件
        System.out.println(f2.length());//java工程里的文件都用相对路径来找，兼容性更好，换电脑了也没关系。

        // 3、File创建对象 ，可以是文件也可以是文件夹	
        File f3 = new File("D:\\JAVA学习\\乱七八糟/文件操作\\游戏");
        System.out.println(f3.exists()); // 判断这个路径是否存在，这个文件夹是否存在
        
//     	根据父路径名字符串和子路径名字符串创建文件对象
        File f4 = new File("D:\\JAVA学习","乱七八糟/文件操作\\游戏");
        System.out.println(f4);
//      根据父路径对应文件对象和子路径名字符串创建文件对象
        File f5 = new File("D:\\JAVA学习");
        File f6 = new File(f5,"乱七八糟/文件操作\\游戏");
        System.out.println(f6.exists());
        System.out.println(f6.getPath());
        
        System.out.println("-------------------------------");
        
        //动态获取文件路径
        //获取类所在包下该文件的路径：
        String file = Test1_new.class.getResource("tt.txt").getFile();
        //以   / 开头，获取类所在根目录下该文件的路径
        String file2 = Test1_new.class.getResource("/data.txt").getFile();
        System.out.println(file2);
        String file3 = Test1_new.class.getResource("/com/qq/XML/ttt.txt").getFile();
        System.out.println(file3);
        
        //获取类所在包下该文件的输入流：
        InputStream i = Test1_new.class.getResourceAsStream("ps.txt");
        System.out.println(i.read());
        //获取类所在根目录下该文件的输入流；
        InputStream i2 = Test1_new.class.getResourceAsStream("/ps.txt");
        System.out.println(i.read());
        
        
        //使用类加载器getClassLoader()，直接写文件名，获取类所在根目录下该文件的路径，不能/开头
        String file4 = Test1_new.class.getClassLoader().getResource("ps.txt").getFile();
        System.out.println(file4); 
        //使用类加载器getClassLoader(),直接写文件名，获取类所在根目录下的输入流，不能/开头
        String file5 = Test1_new.class.getClassLoader().getResourceAsStream("ps.txt").toString();
        
        
        
        

        

        
        
        
        
        
        
        
    }
}
